/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package trab_sd;

import java.io.*;
import java.util.*;
import java.net.*;
import java.util.concurrent.*;
import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;

//Classe respnsavel por receber a lista de usuarios.
public class UserListReceiver implements Runnable {
	
	private Socket connection;		//Conexao a com o cliente
	private User localUser;			//Usuario dono do objeto
	private ObjectInputStream in;	//Stream de leitura
	private ObjectOutputStream out; //Stream de escrita
	private boolean cont;
	
	//Construtor
	public UserListReceiver( User localUser, Socket connection, ObjectOutputStream out, ObjectInputStream in ) {
		this.connection = connection;
		this.localUser = localUser;
		this.out = out;
		this.in = in;
		cont = connection.isConnected();
	}
	
	//Rotina da thread. Recebe a lista de usuario e, caso seja
	//o servidor, envia uma copia atuallizada a todos.
	public void run() {
		try {
			if (cont == false) return;
			
			//Envia uma resposta indicando que ja esta preparado para receber.
			out.writeUTF("OK");
			out.flush();
			
			//Le a lista de usuario enviada
			UserList tmpUL = (UserList) in.readObject();
			
			//Espera o aviso de que o objeto terminou de ser enviado.
			if (!in.readUTF().equals("FINISHED") )
				throw new SocketTimeoutException();			//MUDAR ESSA INTERRUPCAO
			
			//Atualiza a lista local
			localUser.updateUserList(tmpUL);
			
			//Se for o servidor, chama um UserListSender
			if ( localUser.isServer() ) {
				localUser.sendUserListToAll();
			}
			
			//Termina a rotina
			return;
		}
		//Caso a classe recebida nao seja uma lista de usuario, fecha a conexao.
		catch ( ClassNotFoundException cnfe ) {
			cnfe.printStackTrace();
		}
		catch ( Exception e ) {
			e.printStackTrace();
		}
		finally {
			try {
				//Fecha os streams
				out.close();
				in.close();
				connection.close();
			}
			catch (IOException sioe) {
				System.out.println("CNFE_IOE");
				sioe.printStackTrace();
			}
		}
		
	}	
}
